23

» WarCraft 3 / общий вопрос про jass

Похожие вопросы:

ответ
в качестве параметра Condition должна быть функция которая takes nothing returns boolean
для ForGroupBJ должна быть функция takes nothing returns nothing
смотри гуишные примеры и читай статьи

23

» WarCraft 3 / помогите вспомнить карту

Похожие вопросы:

ответ
8gabriel8, точно. Их там нет. Я перепутал. Не в константах, а в интерфейсе.
Текст - Общий - Жульничество разрешено
ответ
закрыт по таймауту
ответ
Eota: Exodus
оригинальный автор DarnYak
поищи его последнюю карту...
помню раньше ещё был оф. сайт... но он вроде упал...
поиграть в эту карту еще. Никто из друзей и знакомых не помнит, но не приснилась же мне эта карта!
не приснилась... хорошая карта, но толпой играть слишком легко...

P.S. а нет, сайт ещё жив, кажется

23

» WarCraft 3 / Враг на миникарте

Похожие вопросы:

ответ
с погоней всё легко(если ты конечно не хочешь чтобы аи прошёл Тест Тьюринга)
если юнит врага видим то запоминаем его координаты и идём к нему
если юнит врага исчез из области видимости (ушёл в туман/инвиз) то идём к последнему местонахождению врага(наши запомненные координаты)
стоит совместить это с проверкой на смерть цели погони(чтобы не бежать к трупу) и с проверкой на угрозу (чтобы не залезть под фонтан случайно)
добавить кода и специй по вкусу
ответ
~8gabriel8:
Это пинг, но ты указал, что он через Alt, чего прежде не делал, потому и удивился. Ну вот всех врагов на карте выбираешь и пинг им ставишь)

23

» WarCraft 3 / огненный дождь.

Похожие вопросы:

ответ
А что мешает поставить время жизни 0 сек, тогда у него не будет таймера жизни и он не помрет по истечению времени.
Используя событие - юнит призвал юнита, можно установить желаемое время жизни призванного юнита.
ответ
quq_CCCP, Уже решил, нужно создать любой ии в редакторе ии, и запустить его со стартом карты. Тогда юниты применяют абилки.
ответ
Ну тот же огненный дождь, там можно настроить лимит урона на волну, а так же настроить урон от горения, т.е на врагах появляется дебафф который их жжет несколько секунд. Ну еще можно абилку огенный голем, в версии где может упасть несколько големов с интервалом, вместо эффекта падения голема сделай эффект землетрясения, а вместо големов щупальца, типо из под землю вылазят. Правда оглушать будет.
ответ
biridius:
Приказ который туда подставляется гуями - от обычного огнедождя питлорда "rainoffire";
А нужен приказ "rainofchaos".
Баг редактора.
так все и есть, хоть ты и ставишь в редакторе абилку типа архимонда в, а в коде указана абилка питлорда, можно тут через кастом скрипт тогда
call IssuePointOrderLocBJ( gg_unit_hfoo_0002, "rainofchaos", GetUnitLoc(gg_unit_hfoo_0001) )
тогда все будет работать

23

» WarCraft 3 / Паразит.

Похожие вопросы:

ответ
Конечно не кастуют, ии получает приоритет исходя из того кто большее всех дерется, кто напал или убивает союзника тот и есть наиболее подходящая цель.
Триггерно проверять нет ли в пределах досигаймости юнита без баффа, если есть то пытатся кастануть в него некоторый скилл - к примеру проклятие банши.
ответ
N7 Molot:
Andcatman:
То есть дами должен атаковать а потом кастовать. я не понел. Покажи как это выглядит.
Да какая атака? Если у тебя есть JNGP то там есть функция "Отдать приказ через строку" - в строке пишешь "parasite".
Если нету, то делаешь личный сценарий (script code) - в не прописываешь "call IssueTargetOrderBJ( (даммик), "parasite", (цель) )".
ответ
SaveUnitHandle(hash,GetHandleId(target),7,caster);
GetHandleId(target) - хендл самого юнита
LoadUnitHandle(hash,GetUnitTypeId(u),7);
GetUnitTypeId(u) - Ид типа юнита, а не хендл.

23

» WarCraft 3 / Превращение в зомби.

Похожие вопросы:

ответ
Если юнит под баффом "чума" - добавить в отряд Чума
Иначе - удалить из отряда Чума
Триггер
С. Таймер Чума
Отряд выбрать юнитов Чума
Если юнит умер
Д. создать юнита в позиции выбранного юнита.

23

» WarCraft 3 / Ошибка в редакторе моделей

Похожие вопросы:

ответ
dave_wwid, уже заметил что даная проблема происходит после сжатия модели стандартными функциями в mdlvis. Нашел лично для себя альтернативу так что вопрос закрываю.
ответ
~8gabriel8:
Файл карты - это архив, где содержатся файлы с данными о ландшафте, тенях, юнитах, триггерах и прочего этой карты. Бегло посмотрел пустую карту и насколько понял, за ландшафт отвечают три самых больших файла: в одном содержится информация о текстурах тайлов, в другом о тенях на тайлах, в третьем либо о проходимости, либо о высотах ландшафта. Может быть ещё где-то хранится информация, но не суть. Файл с данными о тенях war3map.shd можно удалить, при сохранении редактор его создаст заново, а вот два других файла war3map.w3e и war3map.wpm нужно аккуратно увеличить, копируя данные внутри них. Только, как отметил Jack-of-shadow, есть лимит у редактора и игры. Не факт, что редактор вообще откроет, а потом сохранит такую большую карту. Если всё-таки хочешь попытаться, то качай:
  • Ladik's MPQ Editor xgm.guru/p/wc3/ladiks-mpq для открывания MPQ-архивов и карт;
  • Notepad++ notepad-plus-plus.org/download/v7.5.8.html для редактирования файлов, так как обычные текстовые редакторы могут не сохранить правильно все символы.
И тренируйся сперва сделать с помощью этого из карты 32х32 карту 64х64, как получится, можно из 256х256 попытаться сделать 512х512. Если с ней не будет проблем, то можно продолжать.
P. S. Stason888045:
У меня абсолютно нет никаких навыков даже в элементарном программировании, разобрать прогу или игру самому - не осилю ни за что.
А как триггеры делаешь? Как раз элементарное программирование.
ответ
В мпк редакторе открой карту да удали модель, вот и все.

23

» WarCraft 3 / Какой лимит размера карты?

Похожие вопросы:

ответ
Цикл — это loop? Мб лимит операций. Попробуй таймером.
Изменение текстур земли — это
SetTerrainType(real x, real y, integer terrainType, integer variation, integer area, integer shape)
ответ
20 - 30 к разрушаемых объектов, главное что бы у них не стояло галочки "можно пройти". А вот то что в кадре, это уже другое ограничение. Это зависит от полигонажа моделей. Кажется больше 60 тысяч полигонов в кадре начинают плясать. Анимация сама по себе не на что не повлияет, а вот кол-во костей возможно. но 2-3 на каждый куст вполне можно.

А если кодом, то мелкую траву можно вообще спавнить как спецефекты.
1.Либо в точки где тлайсет раскрашен травой.
2.Можно расставить в редакторе, как декорации, а потом получить список в *doo. И блокнотиком зареплейсить, на эфекты.
ответ
~8gabriel8:
Файл карты - это архив, где содержатся файлы с данными о ландшафте, тенях, юнитах, триггерах и прочего этой карты. Бегло посмотрел пустую карту и насколько понял, за ландшафт отвечают три самых больших файла: в одном содержится информация о текстурах тайлов, в другом о тенях на тайлах, в третьем либо о проходимости, либо о высотах ландшафта. Может быть ещё где-то хранится информация, но не суть. Файл с данными о тенях war3map.shd можно удалить, при сохранении редактор его создаст заново, а вот два других файла war3map.w3e и war3map.wpm нужно аккуратно увеличить, копируя данные внутри них. Только, как отметил Jack-of-shadow, есть лимит у редактора и игры. Не факт, что редактор вообще откроет, а потом сохранит такую большую карту. Если всё-таки хочешь попытаться, то качай:
  • Ladik's MPQ Editor xgm.guru/p/wc3/ladiks-mpq для открывания MPQ-архивов и карт;
  • Notepad++ notepad-plus-plus.org/download/v7.5.8.html для редактирования файлов, так как обычные текстовые редакторы могут не сохранить правильно все символы.
И тренируйся сперва сделать с помощью этого из карты 32х32 карту 64х64, как получится, можно из 256х256 попытаться сделать 512х512. Если с ней не будет проблем, то можно продолжать.
P. S. Stason888045:
У меня абсолютно нет никаких навыков даже в элементарном программировании, разобрать прогу или игру самому - не осилю ни за что.
А как триггеры делаешь? Как раз элементарное программирование.

23

» WarCraft 3 / Особый удар

Похожие вопросы:

ответ
Темы-паровозы с обсуждениями создавайте в личном блоге.
ответ
Итак, спустя 30 часов тестов по 10 минут каждый я нашел проблему.
После 10 минуты при юза огненного столба (его юзали компы, если не я) зависает варкрафт. РЕФАНДЕД спасибо! Инфа сотка, такая проблема оказалась не только у меня в проекте.
Спасибо всем, кто пытался помочь, вы лучшие! :)
Тема закрыта.

23

» WarCraft 3 / Нужна помощь мультиборд

Похожие вопросы:

ответ
Melissa, Короче я разобрался - все проблемы были из-за переменной Total_Num_Players, она была подбита под живых игроков, а так как я был единственным живым игроком, то давала строку равную 1 (то есть 0+1 я). В общем спасибо, не додумал бы без твоей помощи до своей ошибки(у тебя ведь создаётся по заданому числу количество строк).
ответ

23

» WarCraft 3 / Исчезновение звука

Принятый ответ
Похожие вопросы:

ответ
Значит вордедит глючит с тригами
ответ
Убрать звуки моделям в War3ME или вместо анимаций прятать юнитов (Unit - Hide).
Steal nerves, добавлю: чтобы сделать их бессмертными и невыбираемыми, можно дать способность "Москиты". Тень убирается в РО.
ответ
~8gabriel8:
Diaboliko, вот начальная версия эффекта:
вот ей звуки поставил:
и для сравнения Божественный щит:

Короче, так как не разобрался, то сделал пока костыль. Герой этот использует анимацию Spell лишь для этой способности, потому прописал звук появления прямо в модель героя, ну а звук исчезновения у эффекта всё равно работает.

23

» WarCraft 3 / гнев деревьев (корни)

Похожие вопросы:

ответ
SetUnitPropWindow
Спс, что то раньше этой нативки не видел, ну пока сделал на пересоздании предмета, там посмотрим.
ответ
Чел, создовай даммика в "Отряде", там где ты и заставляешь его юзать корни, чтобы создался даммик для каждого врага в диапозоне.
ответ
Выбрать всех юнитов в зоне каста и для каждого юнита делать дамми заставлять кастовать на выбранного юнита.

23

» WarCraft 3 / Как отследить улучшения зданий?

Похожие вопросы:

ответ
AlexSan, делаем бд и по событию пишем данные в бд
подробнее в статьях
если хочешь красиво то делай свой вар с картами и эльфийками

23

» WarCraft 3 / Как сделать подсчет игроков?

Принятый ответ
Похожие вопросы:

ответ
~8gabriel8:
Вот карта с триггером, где создаются юниты для играющих с учётом их цвета:
Если всё-таки нужно количество, то далее поставил действие, которое выводит на экран число играющих, просто укажи его целочисленной переменной.
Если нужно количество только реальных игроков или только компьютеров, то добавь соответствующие условие.

Скрин триггера:

Пока делал карту и печатал ответ, PyCCKuu_4eJl опубликовал свой вариант.

23

» WarCraft 3 / Переключающий юнит

Похожие вопросы:

ответ
Вроде можно как TriggeringUnit, ибо ссылается на одного юнита. Взял бы проверил сам дебагом, название юнита выводи на экран
по-другому никак
Кроме событий почти никак, можно периодически таймером проверять. Вот можно проверять периодически с помощью группы и счётчика кол-во юнитов в области, стало ли больше или меньше. Неудобно. Юнит выбран можно также заменить периодической проверкой таймером, есть условием - юнит выбран игроком, то есть вами, через GetLocalPlayer(), не знаю дисихрон будет. Или какой-то другой игрок. Наверное тоже неудобства есть.
ответ
А разве это не работает?
Там просто написано 'герой', а на самом деле не обязательно герой должен быть
ответ
AgaraSatan, так и думал.
там нужно не тип "исследуемый юнит", там другая переменная "переключаемый юнит (англ. triggering unit)". Исследуемый юнит - работает при событии юнит изучает/исследует. у тебя условие просто не прокатывает. делай дебаги
ответ
Для начала проверь отрабатывает ли у тебя событие. Добавь действие "показать сообщение". Если норм, то замени эффект на стандартный. Если норм, значит дело в модели.

23

» WarCraft 3 / Помощ в триггерах

Похожие вопросы:

ответ
ilyhaspmarine, я тут посмотрел. Его можно просто триггерно заменить, предметы не пропадут. А эффект того света что при повышении уровня, тоже можно сделать триггерно.
ответ
При осмотре карты тоже не совсем понял почему игра перестает строительство. Как решение, ты можешь даммику строительства поменять расу на нежить, таким образом уже здание само будет достраиваться.
Поскольку у тебя на карте при беглом осмотре юнитов строителей я не заметил, то выше указанное решение как раз то что нужно тебе.
П.С.
Под какую версию игры рассчитана данная карта?

23

» WarCraft 3 / Выбор игрока в Preload

Похожие вопросы:

ответ
""function CodeGen_SaveToDisk takes string loadcode, string filename returns nothing
call PreloadGenClear()
call PreloadGenStart()
call Preload(loadcode)
call PreloadGenEnd(filename)
call ClearSelection()
endfunction""
Этот блок надо помещать под GetLocalPlayer()== твой игрок
В функции function CodeGen_Compile takes nothing returns string у тебя вместо игрока используется GetTriggerPlayer(), который равен null.

В данной системе есть ошибка. А именно. В функции:
function CodeGen_Encode takes integer i returns string
    local integer b
    local string s = ""
    
    if i <= udg_SaveLoad_Base then
        return SubString(udg_SaveLoad_Alphabet, i, i + 1)
    endif
    
    loop
        exitwhen i <= 0
        set b = i - (i / udg_SaveLoad_Base) * udg_SaveLoad_Base
        set s = SubString(udg_SaveLoad_Alphabet, b, b + 1) + s
        set i = i / udg_SaveLoad_Base
    endloop
    
    return s
endfunction
надо изменить:
    if i <= udg_SaveLoad_Base then
        return SubString(udg_SaveLoad_Alphabet, i, i + 1)
    endif
на:
    if i < udg_SaveLoad_Base then
        return SubString(udg_SaveLoad_Alphabet, i, i + 1)
    endif

23

» WarCraft 3 / Вылетает

Похожие вопросы:

ответ
XGM Bot:
Похожие вопросы:

ответ
Бэкапы надо было делать, мсье. Перед внесением каких-либо серьезных изменений.
ответ
Проблема решена.
ответ
Вообщем перенастроил Jass New Gen Pack карта как то по другому сохранилась с проверками и всё наладилось)

ответ
Судя по скрину, это версия 1.26. Для проверки кода подойдёт программа UnrealJassSpy www.hiveworkshop.com/threads/unreal-jass-spy-1-26a.244384
Кидаешь её файлы в папку с игрой, запускаещь игру, ждешь внедрения (жмешь ок), запускаешь карту. Потом в логах JassSpy.txt смотришь на каком месте у тебя прервалась игра.

23

» WarCraft 3 / Нужны идеи для героя

Похожие вопросы:

ответ
Sergant1000, а от меня нет
это не вопрос а заказ
так что ему туда
пусть выбирает то которое больше понравится
ответ
Спелл довольно сложен, так просто вы его не сделаете. Необходимо подключать систему урона как минимум.
ответ
  1. а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
    б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
    В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
    Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
ответ
Все должно действовать, постоянно именно так и делаю. Триггер в студию.
P. S. Только одна оговорка: на всякий случай будет лучше, если способность, даваемая даммику, заранее будет присутствовать у какого-нибудь юнита на карте (можно нейтрального и/или не способного её скастануть), иначе иногда не исключены ситуации, когда даммик просто не кастует добавленную ему способность вообще (зависимость определить не удалось, абсолютно в одной и той же уже сохраненной и оптимизированной карте может кастовать, а может не кастовать - если не стал кастовать эту абилу в первый раз, то и всю игру - т. е. весь конкретный запуск конкретно этой карты - уже не станет, но добавлением абилы заранее нейтральному зданию, т. е. прелоадом, лечится надёжно).

23

» WarCraft 3 / Анимация прыжка

Похожие вопросы:

ответ
~8gabriel8:
Hate, всмысле? Я карту к вопросу приложил вообще-то.
Лучше вот новая версия с тегами
Ну я сделал, короче, добавив два триггера. Один отлавливает любой приказ дамочки во время сальто и устанавливает ей скорость анимации в 10000х(время таймера+0,01)%, потом устанавливает анимацию соответствующего сальто и запускает таймер на 0,01 секунду. Второй по истечению этого таймера устанавливает дамочке скорость анимации 100%.
Выглядит временами не особо гладко, но в целом меня устраивает. Только надо немножко подкорректировать анимации модели.
ответ
XGM Bot:
Похожие вопросы:

ответ
nvc123:
Nyanta, для начала дебаг сделать как написано в статье
Сделал. Триггер работает как нужно. При входе всегда пишет "Вход!", при выходе - "Выход!". Порядок текста не меняется.
В общем, проблема, почему-то, была в названии анимации. Открыл модель через MdlVis и назвал анимации "родными" словами Stand, Walk, Death. Стало работать как надо.
Спасибо Rare за
Rare:
ставь скорость анимации на 0%
И nvc123 за то, что натолкнул на мысль этим)
nvc123:
конфликт триггеров,неправильный проигрыш анимаций
ответ
Ошибка при работе с MdlVis. Попробуй открыть модель в версии 1.40, там должно изменение видимости в ключевых кадрах должно заработать. Однако советую сделать копию модели, т.к. 1.40, если не изменяет память, ломает уже настроенную видимость.
ответ
Лучше проверить, присоединён ли он к тем же костям, что и соседние вершины. Если нет — присоединить. Если да, то как сказали Melissa и nvc123.
ответ
Анимация кости базы при death сместилась у конечной точки в линейке анимации. Поправил. В игре потестил, работает. Рассчитать границы нужны когда делаешь новые или изменяешь старые анимации, одна из причин чтоб анимация не сместилась и была на своем месте. Но в твоем случае она сразу не помогла.
ответ
скорее всего связано с кешированием данных, попробуй первым на карту занружать юнитов, и только потом декорации


23

» WarCraft 3 / Как сделать лучше

Похожие вопросы:

ответ
Всё равно большинство игроков формирует отряды по ролям: стрелки в одну группу, рукопашные в другую и т. д. Поэтому я голосую за первый вариант. А чтобы было удобнее, можно добавить функцию "выбрать всех" или что-то в этом духе.
ответ
Ну только триггерные системы отрядов, была такая...
Вот пример ссылочка
Были и другие, поиск в помощь.
Вот еще ссылка
ответ
Что за ересь несете
Асисты делаются на изи -_-
ответ
Drulia_san, Ну да.
Добавляешь аурку - вот тебе баф на юните. Самый простой способ как по мне.
+Можно эффекты настроить, что вполне неплохо. Пока висит фейковый баф(наша аура) - на юните есть эффект.
Через дамми касты я пробовал, но долго+муторно+подключается дамми система = +лаги и местами утечки.
Насчёт таймаута - это уже по самим спеллам, я долго мучался чтобы оно всё работало как надо и не оверлапалось
Вот такой штукой у меня удаляется баф:
public function unitRemoveAbilityandBuffBY(unit u,integer dhv,integer mLv) returns boolean
	boolean b=UnitRemoveAbility(u,dhv)
  	UnitMakeAbilityPermanent(u,false,dhv)
  	UnitRemoveAbility(u,mLv)
	return b
ответ
Простой ответ - никак. Невозможно добавить автокаст к способности у которой его изначально не было.
Сложный ответ - триггерно имитировать автокаст одним из нескольких способов.

23

» WarCraft 3 / Простая триггерная способность

Похожие вопросы:

ответ
Если использовать событие - юнит завершает применение способности - цель не ловиться. Нужно либо сохранить её раньше, либо делать таймер с задержкой. По функциональности лучше второй вариант, можешь добавить полоску каста на текстаге, или еще что-нибудь.
ответ
~16GB:
Создаёт стену из магического льда, которая отталкивает противников от себя.
function IsUnitDeadBX takes unit u returns boolean
return GetUnitTypeId(u) == 0 or IsUnitType(u, UNIT_TYPE_DEAD)
endfunction

function IsTarget takes unit u,unit d returns boolean
return not IsUnitType(u,UNIT_TYPE_ANCIENT) and not IsUnitDeadBX(u)  and not IsUnitType(u, UNIT_TYPE_STRUCTURE) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and (IsUnitEnemy(u, GetOwningPlayer(d)) or GetOwningPlayer(u) == Player(15))
endfunction

function SQ takes real xa, real ya, real xb, real yb returns real
return SquareRoot((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))
endfunction

function SafeX takes real pxx returns real
local real lfr=GetRectMinX(bj_mapInitialPlayableArea)+50
if(pxx<lfr)then
return lfr
endif
set lfr=GetRectMaxX(bj_mapInitialPlayableArea)-50
if(pxx>lfr)then
return lfr
endif
return pxx
endfunction

function SafeY takes real pyy returns real
local real lfr=GetRectMinY(bj_mapInitialPlayableArea)+50
if(pyy<lfr)then
return lfr
endif
set lfr=GetRectMaxY(bj_mapInitialPlayableArea)-50
if(pyy>lfr)then
return lfr
endif
return pyy
endfunction

function UBU takes unit u, unit d, unit c , real w returns boolean
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real r1 = 57.295827*Atan2(y-GetUnitY(d),x-GetUnitX(d))
local real r2 = 57.295827*Atan2(y-GetUnitY(c),x-GetUnitX(c))
set r2 = r2 -180
if r1 < 0.00 then
set r1 = r1 + 360
endif
if r2 < 0.00 then
set r2 = r2 + 360
endif
if r1 - r2  <= w and r1 - r2  >= -(w) then
return true
else
return false
endif
endfunction


function IceWallCon takes nothing returns boolean
return GetSpellAbilityId() == 'A0KP'
endfunction

function IceWallCreate takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit c = LoadUnitHandle(udg_AssassinHash,id,0)
local real r = LoadReal(udg_AssassinHash,id,3)
local integer i = LoadInteger(udg_AssassinHash,id,4)
local integer j = LoadInteger(udg_AssassinHash,id,5)
local real x = LoadReal(udg_AssassinHash,id,StringHash("X"))
local real y = LoadReal(udg_AssassinHash,id,StringHash("Y"))
local real a = 0.
local real b = 0.
local boolean e = LoadBoolean(udg_AssassinHash,id,6)
local boolean f = LoadBoolean(udg_AssassinHash,id,7)
local boolean k = LoadBoolean(udg_AssassinHash,id,8)
local integer n = LoadInteger(udg_AssassinHash,id,25)
local real X2 = LoadReal(udg_AssassinHash,id,StringHash("X2"))
local real Y2 = LoadReal(udg_AssassinHash,id,StringHash("Y2"))
local real X3 = LoadReal(udg_AssassinHash,id,StringHash("X3"))
local real Y3 = LoadReal(udg_AssassinHash,id,StringHash("Y3"))
local integer h = 0
local group g = LoadGroupHandle(udg_AssassinHash,id,2)
local unit u
local unit d
local unit d1
if e == false then
set i = i+1
set j = j+1
if i < 7 then
set a = SafeX(x+(80.*i)*Cos(r))
set b = SafeY(y+(80.*i)*Sin(r))
set d = CreateUnit(GetOwningPlayer(c),'e00V',a,b,0)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,150,0)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",a,b))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",a,b))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU1"+I2S(i)),d)
set a = SafeX(x-(80.*j)*Cos(r))
set b = SafeY(y-(80.*j)*Sin(r))
set d = CreateUnit(GetOwningPlayer(c),'e00V',a,b,0)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,150,0)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",a,b))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",a,b))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU2"+I2S(j)),d)
call SaveInteger(udg_AssassinHash,id,4,i)
call SaveInteger(udg_AssassinHash,id,5,j)
else
call SaveBoolean(udg_AssassinHash,id,6,true)
endif
else
if f == false then
call SaveInteger(udg_AssassinHash,id,4,0)
call SaveReal(udg_AssassinHash,id,3,r-1.566)
call TimerStart(t,.025,true,function IceWallCreate)
call SaveBoolean(udg_AssassinHash,id,7,true)
else
set i = i+1
if i < 201 then
call SaveInteger(udg_AssassinHash,id,4,i)
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU16"))
set d1 = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU26"))
call GroupClear(udg_G)
call GroupEnumUnitsInRange(udg_G,x,y,1040,null)
loop
set u = FirstOfGroup(udg_G)
if IsTarget(u,c) and UBU(u,d,d1,20.) and IsUnitInGroup(u,g) == false then
call GroupAddUnit(g,u)
if GetUnitAbilityLevel(c,'B009') > 0 then
call UnitDamageTarget(c,u,150.+80.*GetUnitAbilityLevel(c,'A0KP'),true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
else
call UnitDamageTarget(c,u,75.+40.*GetUnitAbilityLevel(c,'A0KP'),true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
endif
set n = n+1
call SaveInteger(udg_AssassinHash,id,25,n)
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(n)),15)
if SQ(X3,Y3,GetUnitX(u),GetUnitY(u)) > SQ(X2,Y2,GetUnitX(u),GetUnitY(u)) then
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(n)),LoadReal(udg_AssassinHash,id,20))
else
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(n)),LoadReal(udg_AssassinHash,id,21))
endif
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(n)),u)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\FrostArrows\\NagaColdArrowMissile.mdl",u,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",u,"chest"))
endif
call GroupRemoveUnit(udg_G,u)
exitwhen u == null
endloop
set i = 1
if n > 0 then
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))-1
set r = LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)),h)
call SetUnitPathing(u,false)
call SetUnitX(u,SafeX(GetUnitX(u)+15.*Cos(r)))
call SetUnitY(u,SafeY(GetUnitY(u)+15.*Sin(r)))
call IssueImmediateOrder(u,"stop")
if ModuloInteger(h,3) == 0 then
call DestroyEffect(AddSpecialEffectTarget("FrozenOrbBall.mdx",u,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",u,"chest"))
endif
set i = i + 1
endloop
set i = 1
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
if h <= 0 or IsUnitDeadBX(u) or not IsTarget(u,c) then
set j = i
call GroupRemoveUnit(g,u)
call SetUnitPathing(u,true)
loop
exitwhen j > n
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j)),LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j+1))))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j)),LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j+1))))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j)),LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j+1))))
set j = j + 1
endloop
set n = n-1
call SaveInteger(udg_AssassinHash,id,25,n)
endif
set i = i + 1
endloop
endif
else
set i = 1
if n > 0 then
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))-1
set r = LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)),h)
call SetUnitPathing(u,false)
call SetUnitX(u,SafeX(GetUnitX(u)+15.*Cos(r)))
call SetUnitY(u,SafeY(GetUnitY(u)+15.*Sin(r)))
call IssueImmediateOrder(u,"stop")
if ModuloInteger(h,3) == 0 then
call DestroyEffect(AddSpecialEffectTarget("FrozenOrbBall.mdx",u,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",u,"chest"))
endif
set i = i + 1
endloop
set i = 1
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
if h <= 0 or IsUnitDeadBX(u) then
set j = i
call GroupRemoveUnit(g,u)
call SetUnitPathing(u,true)
loop
exitwhen j > n
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j)),LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j+1))))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j)),LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j+1))))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j)),LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j+1))))
set j = j + 1
endloop
set n = n-1
call SaveInteger(udg_AssassinHash,id,25,n)
endif
set i = i + 1
endloop
endif
if k == false then
set j = 1
loop
exitwhen j > 6
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU1"+I2S(j)))
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",GetUnitX(d),GetUnitY(d)))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",GetUnitX(d),GetUnitY(d)))
call KillUnit(d)
set j = j + 1
endloop
set j = 1
loop
exitwhen j > 6
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU2"+I2S(j)))
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",GetUnitX(d),GetUnitY(d)))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",GetUnitX(d),GetUnitY(d)))
call KillUnit(d)
set j = j + 1
endloop
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"))
call KillUnit(d)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",GetUnitX(d),GetUnitY(d)))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",GetUnitX(d),GetUnitY(d)))
call SaveBoolean(udg_AssassinHash,id,8,true)
endif
if k and n <= 0 then
call DestroyGroup(g)
call DestroyTimer(t)
call FlushChildHashtable(udg_AssassinHash,id)
endif
endif
endif
endif
set t = null
set c = null
set d = null
set d1 = null
set g = null
set u = null
endfunction

function IceWall takes nothing returns nothing
local unit c =  GetSpellAbilityUnit()
local real a = GetUnitX(c)
local real b = GetUnitY(c)
local real x = SafeX(GetSpellTargetX())
local real y = SafeY(GetSpellTargetY())
local real r = Atan2(y-b,x-a)+1.566
local timer t = CreateTimer()
local real dist = SQ(a,b,x,y)*2.
local integer id = GetHandleId(t)
local unit d
set d = CreateUnit(GetOwningPlayer(c),'e00V',x,y,0)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,150,0)
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"),d)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",x,y))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",x,y))
call SaveUnitHandle(udg_AssassinHash,id,0,c)
call SaveReal(udg_AssassinHash,id,3,r)
set r = Atan2(y-b,x-a)
call SaveReal(udg_AssassinHash,id,20,r)
call SaveReal(udg_AssassinHash,id,21,Atan2(b-y,a-x))
call SaveReal(udg_AssassinHash,id,StringHash("X2"),a+dist*Cos(r))
call SaveReal(udg_AssassinHash,id,StringHash("Y2"),b+dist*Sin(r))
call SaveReal(udg_AssassinHash,id,StringHash("X3"),a)
call SaveReal(udg_AssassinHash,id,StringHash("Y3"),b)
call SaveGroupHandle(udg_AssassinHash,id,2,CreateGroup())
call SaveReal(udg_AssassinHash,id,StringHash("X"),x)
call SaveReal(udg_AssassinHash,id,StringHash("Y"),y)
call TimerStart(t,.025,true,function IceWallCreate)
set t = null
set c = null
set d = null
endfunction
ответ
Кароч
есть инфа
что если хочешь стандартный скилл с небольшим изменением
но не можешь отловить его цели
то можно тупо ловить урон
при этом кастуя скилл с даммика
и вылавливать урон только от даммика
да?
Но это вариант для тех кому лень...
а тебе я так вижу не лень